package cn.itcast.web.controller.cargo;

import cn.itcast.domain.cargo.ContractProductVo;
import cn.itcast.service.cargo.ContractService;
import cn.itcast.utils.DownloadUtil;
import cn.itcast.web.controller.BaseController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/cargo/contract")
public class ExcelController extends BaseController {
    @Reference
    private ContractService contractService;

    /*
      出货表
          地址：/cargo/contract/print.do
   */
    @RequestMapping("/print")
    public String print(){
        return "cargo/print/contract-print";
    }

    /*
        原生pol查询出货表
            地址：/cargo/contract/printExcel.do?inputDate=2015-01
            参数：用户选择的时间
            业务：
                1、根据船期查询数据
                2、构造Excel文件
                3、下载Excel文件
     */
    @RequestMapping("/printExcel")
    public void printExcel(String inputDate) throws IOException {
        //1、根据船期查询数据
        List<ContractProductVo> list= contractService.findByShipTime(inputDate+"%");
        
        //2、构造Excel文件
        //创建工作簿
        Workbook wb = new XSSFWorkbook();
        //创建第一页(参数为创建页的名称
        Sheet sheet = wb.createSheet("heima23");
        //创建大标题（第一行）
        Row row = sheet.createRow(0);//使用的是索引，所以从0开始
        //创建第二个单元格
        Cell cell = row.createCell(1);//使用的是索引，所以从0开始
        //设置单元格内容
        inputDate=inputDate.replaceAll("-0","-").replaceAll("-","年");
        cell.setCellValue(inputDate+"月份出货表");
        //构造小标题
        //创建第二行
        row=sheet.createRow(1);
        String [] titles = new String[]{"","客户","订单号","货号","数量","工厂","工厂交期","船期","贸易条款" };
        for (int i = 0; i < titles.length; i++) {
            String title = titles[i];
            //4.2 创建每一个单元格
            cell = row.createCell(i);
            //4.3 设置单元格的内容
            cell.setCellValue(title);
        }
        //5.循环数据列表，构造数据行内容
        int index = 2;
        for (ContractProductVo cp : list) {
            row = sheet.createRow(index);

            cell = row.createCell(1);
            cell.setCellValue(cp.getCustomName());

            cell = row.createCell(2);
            cell.setCellValue(cp.getContractNo());

            cell = row.createCell(3);
            cell.setCellValue(cp.getProductNo());

            cell = row.createCell(4);
            cell.setCellValue(cp.getCnumber());

            cell = row.createCell(5);
            cell.setCellValue(cp.getFactoryName());

            cell = row.createCell(6);
            cell.setCellValue(cp.getDeliveryPeriod());

            cell = row.createCell(7);
            cell.setCellValue(cp.getShipTime());

            cell = row.createCell(8);
            cell.setCellValue(cp.getTradeTerms());

            index ++;
        }

        //3、文件下载
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        wb.write(bos);
        new DownloadUtil().download(bos,response,"出货表.xlsx");//参数 ByteArrayOutputStream,response,下载文件名
    }

    /*
        使用EasyExcel下载出货表
            地址：/cargo/contract/printEasyExcel.do?inputDate=2015-01
            1、给实体类添加EasyExcel注解
            2、查询数据
            3、设置下载信息
            4、调用EasyExcek的工具类完成生成下载
     */

    @RequestMapping("/printEasyExcel")
    public void printEasyExcel(String inputDate) throws IOException {
        //查询数据
        List<ContractProductVo> list = contractService.findByShipTime(inputDate + "%");
        //设置下载信息
        response.setContentType("application/vnd.ms-excel");//设置要下载的格式数excel格式
        response.setContentType("utf-8");//设置下载的内容为utf-8（处理下载中文乱码）
        String fileName = URLEncoder.encode("出货表", "utf-8");//设置Excel表的表名及格式
        response.setHeader("Content-disposition","attachment;filename=" + fileName + ".xlsx");

        //调用EasyExcel的工具类完成生成下载
        EasyExcel.write(response.getOutputStream())
                .head(ContractProductVo.class)//设置表头
                .sheet("heima23")//指定也名称
                .doWrite(list);//设置数据
    }

    /*
        使用EasyExcel模板下载
        地址：/cargo/contract/printTemplate.do?inputDate=2015-01

        1、获取数据
        2、设置下载信息
        3、加载Excel下载模板
        4、创建EasyExcel的ExcelWtire对象
     */
    @RequestMapping("/printTemplate")
    public void printTemplate(String inputDate) throws IOException {
        //查询数据
        List<ContractProductVo> list = contractService.findByShipTime(inputDate + "%");
        Map map = new HashMap<>();
        inputDate = inputDate.replaceAll("-0","-").replaceAll("-","年");
        map.put("time",inputDate);
        map.put("title1","客户名称");
        //设置下载信息
        response.setContentType("application/vnd.ms-excel");//设置要下载的格式数excel格式
        response.setContentType("utf-8");//设置下载的内容为utf-8（处理下载中文乱码）
        String fileName = URLEncoder.encode("出货表", "utf-8");//设置Excel表的表名及格式
        response.setHeader("Content-disposition","attachment;filename=" + fileName + ".xlsx");
        //加载Excel模板
        String path= session.getServletContext().getRealPath("/")+"/make/tOUTPRODUCT.xlsx";//模板位置
        //创建EasyExcel的ExcelWtire对象（用于数据填充）
        ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
                .head(ContractProductVo.class) //设置表头
                .withTemplate(path) //加载模板
                .build();

        //获取sheet对象
        WriteSheet sheet = EasyExcel.writerSheet().build();
        //调用方法完成填充map数据
        excelWriter.fill(map,sheet);
        //调用方法完成填充list集合
        excelWriter.fill(list,sheet);
        //下载表格，释放资源
        excelWriter.finish();
    }
}
